/*
中介者模式（Mediator Pattern）是一种行为型设计模式，它通过将对象之间的通信封装到一个中介者对象中，来解耦对象之间的直接交互。
中介者模式使得对象之间的通信变得简单而灵活，同时也降低了对象之间的耦合度。

在中介者模式中，通常会有一个中介者（Mediator）对象，它定义了对象之间的通信接口。
具体的对象（Colleague）通过中介者对象来进行通信，而不是直接与其他对象进行交互。
当一个对象需要与其他对象进行通信时，它只需要与中介者对象进行交互，而不需要知道其他对象的存在。

下面是一个使用中介者模式的C语言例程：
*/

#include <stdio.h>
#include <stdlib.h>

// 中介者接口
typedef struct
{
    void (*sendMessage)(void *mediator, void *colleague, const char *message);
} Mediator;

// 具体中介者
typedef struct
{
    Mediator base;
} ConcreteMediator;

void sendMessage(void *mediator, void *colleague, const char *message)
{
    printf("Colleague received message: %s\n", message);
}

Mediator *createMediator()
{
    ConcreteMediator *mediator = (ConcreteMediator *)malloc(sizeof(ConcreteMediator));
    mediator->base.sendMessage = sendMessage;
    return (Mediator *)mediator;
}

// 同事接口
typedef struct
{
    void (*sendMessage)(void *colleague, const char *message);
} Colleague;

// 具体同事
typedef struct
{
    Colleague base;
    Mediator *mediator;
} ConcreteColleague;

void sendMessage(void *colleague, const char *message)
{
    ConcreteColleague *concreteColleague = (ConcreteColleague *)colleague;
    concreteColleague->mediator->sendMessage(concreteColleague->mediator, colleague, message);
}

Colleague *createColleague(Mediator *mediator)
{
    ConcreteColleague *colleague = (ConcreteColleague *)malloc(sizeof(ConcreteColleague));
    colleague->base.sendMessage = sendMessage;
    colleague->mediator = mediator;
    return (Colleague *)colleague;
}

int main()
{
    Mediator *mediator = createMediator();

    Colleague *colleague1 = createColleague(mediator);
    Colleague *colleague2 = createColleague(mediator);

    colleague1->sendMessage(colleague1, "Hello");
    colleague2->sendMessage(colleague2, "Hi");

    return 0;
}

/*
在上面的例程中，首先定义了中介者接口Mediator，其中包含了sendMessage方法。
然后，定义了具体中介者ConcreteMediator，它实现了中介者接口，并负责处理对象之间的通信。
在createMediator函数中，创建了具体中介者对象，并设置其处理通信的方法。
接下来，定义了同事接口Colleague，其中包含了sendMessage方法。
然后，定义了具体同事ConcreteColleague，它实现了同事接口，并通过中介者对象来进行通信。
在createColleague函数中，创建了具体同事对象，并设置其发送消息的方法和中介者对象。
最后，在main函数中，创建了中介者对象和两个具体同事对象，并使用同事对象发送消息。

通过使用中介者模式，我们可以将对象之间的通信封装到一个中介者对象中，使得对象之间的交互变得简单而灵活。
中介者模式可以降低对象之间的耦合度，因为对象只需要与中介者对象进行交互，而不需要知道其他对象的存在。
同时，中介者模式也使得系统的扩展性更好，因为可以通过增加新的具体同事和中介者来扩展系统的功能。
*/